#include "volumetool.h"
#include "ui_volumetool.h"
#include <QGraphicsDropShadowEffect>
#include <QPainter>

VolumeTool::VolumeTool(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::VolumeTool),
    isMuted(false),  // 默认是非静音状态
    volume(20)
{
    ui->setupUi(this);
    // 必须先下载事件过滤器
    ui->sliderBox->installEventFilter(this);

    // 设置这个窗口为弹出窗口
    this->setWindowFlags(Qt::Popup | Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint);
    this->setAttribute(Qt::WA_TranslucentBackground);
    // 窗口添加自定义的阴影效果
    QGraphicsDropShadowEffect* shadow = new QGraphicsDropShadowEffect(this);
    shadow->setOffset(0,0);
    shadow->setColor("#646464");
    shadow->setBlurRadius(10);
    this->setGraphicsEffect(shadow);
    // 将默认的音量设置为 20%
    ui->volumnText->setText("20%");
    // 移动 outLine 到 inLine 的20%
    QRect rect = ui->outLine->geometry();
    // 窗体原本的高度是 180，变成 180*20%，25 是距离上面边框的高度
    ui->outLine->setGeometry(rect.x(), 180-36+25, rect.width(), rect.height());
    // 移动按钮的位置
    ui->sliderButton->move(ui->sliderButton->x(), ui->outLine->y() - ui->sliderButton->height() / 2);

    // 初始化静音图标
    ui->silenceButton->setIcon(QIcon(":/VolumnTool/volumnOpen.png"));
}

VolumeTool::~VolumeTool()
{
    delete ui;
}

void VolumeTool::paintEvent(QPaintEvent *event)
{
    (void)event;

    QPainter painter(this);  // 绘制者
    painter.setPen(QPen(Qt::NoPen));  // 画笔
    painter.setBrush(QBrush(Qt::white));  // 画刷
    // 绘制一个三角形，可以使用 drawPolygon 绘制多边形的函数
    QPoint points[3] = { QPoint(10, 300), QPoint(90, 300), QPoint(50, 330) };
    painter.drawPolygon(points, 3);
}

bool VolumeTool::eventFilter(QObject *watched, QEvent *event)
{
    // 产生事件的控件是音量控制区 sliderBox
    if(watched == ui->sliderBox)
    {
        if(event->type() == QEvent::MouseButtonPress)
        {
            // 鼠标点击：如果是单击，点击后就计算当前音量的大小
            calculateVolumn();
        }
        else if(event->type() == QEvent::MouseButtonRelease)
        {
            // 鼠标释放：释放后就使音量控制区发生音量改变，并发信号给主界面调整音量
            emit setVolume(volume);
        }
        else if(event->type() == QEvent::MouseMove)
        {
            // 鼠标移动：配合鼠标点击，点击后如果拖动就要动态计算当前的音量大小，而且要发送信号给主界面动态改变
            calculateVolumn();
            emit setVolume(volume);
        }
        return true;
    }
    // 其他的事件交给基类去处理
    return QObject::eventFilter(watched, event);
}

void VolumeTool::calculateVolumn()
{
    // 计算当前音量大小 volume
    // 1. 获取鼠标点击时的 y 坐标
    int height = ui->sliderBox->mapFromGlobal(QCursor().pos()).y();
    // 2. 确保点击的未知不越界
    height = height > 205 ? 205 : height;
    height = height < 25 ? 25 : height;
    // 3. 更新 outline 的位置
    ui->outLine->setGeometry(ui->outLine->x(), height, ui->outLine->width(), 205 - height);
    // 4. 更新 sliderButton 的位置
    ui->sliderButton->move(ui->sliderButton->x(), ui->outLine->y() - ui->sliderButton->height() / 2);
    // 5. 计算音量的大小
    volume = (int)((205 - height) / 180.0 * 100);
    // 6. 更新百分比
    ui->volumnText->setText(QString::number(volume) + "%");
}

void VolumeTool::on_silenceButton_clicked()
{
    // 点击了静音按钮之后，切换状态
    isMuted = !isMuted;
    if(isMuted)
    {
        // true 静音状态
        ui->silenceButton->setIcon(QIcon(":/VolumnTool/silence.png"));
    }
    else
    {
        // false 非静音状态
        ui->silenceButton->setIcon(QIcon(":/VolumnTool/volumnOpen.png"));
    }
    // 发射信号到主界面，实现静音非静音切换
    emit setMuted(isMuted);
}
